Prometheus的專用語言promQL

前言

在寫監控告警的時候,看別人寫好的dashboard裡面有一堆函數,
但卻偏偏不知道該怎麼使用,後來才知道這是 Prometheus的語言 PromQL,
這邊會將寫監控時用到的東西記下,基本上都是針對metrics做的處理。

正文

聚合函數

聚合函數可與by 或 without共同使用 ,可取得metrics裡的欄位名稱
例:

sum(rate(istio_requests_total{reporter="destination"}[1m])) by (destination_workload)

內建函數

實際演練

可以先在prometheus上面測試語法,當測試完成後,再放到grafana上面看實際的圖表。
也可透過現有的grafana的dashboard裡面的Query Inspect 將Metric撈出來(這邊可以直接將變數取出)(fig.1)
撈出來的資料要再經過 urldecode 將符號轉成正常的符號

28-fig.1.jpg
(fig.1)

所有的Metric格式如下,
指標名稱只能由ASCII字符、數字、下劃線以及冒號組成並必須符合正則表達式[a-zA-Z_:][a-zA-Z0-9_:]*

<metric name>{<label name>=<label value>, ...}

匹配函數

有時也會在label name上面使用 正規表示法,這邊使用的是RE2語法

例如,我們要取得memory的資料,其中的image的開頭只要包含 gcr.io 跟 istio。

  container_memory_working_set_bytes{id!="/",pod=~".*",image=~"[gcr.io | istio].*"}

變數設定

在grafana上面通常會設定一些參數,這是為了看指定的指標
有四種可選,

常用的label_value

  $Node       label_values(kubernetes_io_hostname)
  $Pod        label_values(kube_pod_info, pod)
  $Pod_ip     label_values(kube_pod_info, pod_ip)
  $phase      label_values(kube_pod_status_phase, phase)
  $container  label_values(kube_pod_container_info, container)

query_result範例,

query_result(kube_deployment_status_replicas{namespace !~ "istio-system|kube-system"}>0)

解釋:排除Deployment裡面的namespace 不是 istio-system或 kube-system,並且value>0的metrics。
這邊會顯示全部的資料,故在regex要再指定抓取 deployment的資料

/.*deployment="(.*?)".*/

ref.
Grafana templating with Prometheus labels
模板化Dashboard
PromQL的簡單使用

ref.
Prometheus-基礎系列-(四)-PromQL語句實踐-2
PromQL 內置函數
PromQL操作符